home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
et
/
et3_0-a1.lha
/
et3
/
src
/
CommandProcessor.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-06-30
|
5KB
|
253 lines
#ifdef __GNUG__
#pragma implementation
#endif
#include "CommandProcessor.h"
#include "Class.h"
#include "ObjArray.h"
#include "Menu.h"
#include "CmdNo.h"
//---- CommandProcessor --------------------------------------------------------
NewMetaImpl(CommandProcessor,Object, (T(changeCount), T(cap)));
CommandProcessor::CommandProcessor()
{
cap= changeCount= 0;
}
CommandProcessor::~CommandProcessor()
{
//if (changeCount > 0)
// Error("~CommandProcessor", "changeCount > 0");
}
Command *CommandProcessor::GetAt(int)
{
return 0;
}
void CommandProcessor::PerformCommand(Command* cmd)
{
if (cmd == 0)
return;
switch (cmd->GetType()) {
case eCmdTypeCantUndo:
FinishFrom(0);
changeCount+= cmd->Perform();
cmd->Done(0);
cmd->Finish();
break;
case eCmdTypeNoChange:
CommandProcessor::PerformNormalCommand(cmd);
break;
case eCmdTypeNormal:
FinishFrom(changeCount);
PerformNormalCommand(cmd);
break;
}
}
void CommandProcessor::PerformNormalCommand(Command* cmd)
{
if (cmd) {
cmd->Perform();
cmd->Done(0);
cmd->Finish();
}
}
void CommandProcessor::DoCreateMenu(Menu *menu)
{
if (menu->GetId() == cEDITMENU) {
if (Size() <= 0)
menu->AppendItems("Can't undo2", cUNDO, 0);
else {
menu->AppendItem("Undo2@Z", cUNDO);
if (Size() >= 2)
menu->AppendItems("Redo2@Z", cREDO, 0);
}
}
}
void CommandProcessor::DoSetupMenu(Menu *menu)
{
if (menu->GetId() == cEDITMENU) {
Command *cmd;
if (cmd= GetAt(changeCount-1)) {
menu->ReplaceItem(cUNDO, cmd->GetUndoName());
if (cmd->GetType() != eCmdTypeCantUndo)
menu->EnableItem(cUNDO);
} else {
menu->ReplaceItem(cUNDO, "Undo@Z");
menu->DisableItem(cUNDO);
}
if (Size() >= 2) {
if (cmd= GetAt(changeCount)) {
menu->ReplaceItem(cREDO, cmd->GetUndoName());
menu->EnableItem(cREDO);
} else {
menu->ReplaceItem(cREDO, "Redo@Z");
menu->DisableItem(cREDO);
}
}
}
}
void CommandProcessor::DoMenuCommand(int cmdId)
{
Command *c;
switch (cmdId) {
case cUNDO:
if (c= GetAt(changeCount-1))
changeCount+= c->Perform();
break;
case cREDO:
if (c= GetAt(changeCount))
changeCount+= c->Perform();
break;
}
}
void CommandProcessor::Finish()
{
FinishFrom(0);
changeCount= 0;
}
void CommandProcessor::FinishFrom(int)
{
}
//---- CommandProcessor1 -------------------------------------------------------
NewMetaImpl(CommandProcessor1,CommandProcessor, (TP(lastCmd)));
CommandProcessor1::CommandProcessor1()
{
lastCmd= 0;
cap= 1;
}
Command *CommandProcessor1::GetAt(int)
{
return lastCmd;
}
void CommandProcessor1::PerformNormalCommand(Command* cmd)
{
if (lastCmd)
lastCmd->Done(cmd);
lastCmd= cmd;
changeCount+= cmd->Perform();
}
void CommandProcessor1::FinishFrom(int)
{
if (lastCmd) {
lastCmd->Finish();
lastCmd= 0;
}
}
//---- CommandProcessorN -------------------------------------------------------
NewMetaImpl(CommandProcessorN,CommandProcessor, (TP(cmdHistory)));
CommandProcessorN::CommandProcessorN()
{
cmdHistory= new ObjArray;
cap= 99999;
}
CommandProcessorN::~CommandProcessorN()
{
SafeDelete(cmdHistory);
}
Command *CommandProcessorN::GetAt(int i)
{
if (i >= 0 && i < cmdHistory->Size())
return (Command*) cmdHistory->At(i);
return 0;
}
void CommandProcessorN::PerformNormalCommand(Command* cmd)
{
Command *lastcmd;
if (lastcmd= GetAt(changeCount-1))
lastcmd->Done(cmd);
cmdHistory->AtPutAndExpand(changeCount, cmd);
changeCount+= cmd->Perform();
}
void CommandProcessorN::FinishFrom(int n)
{
for (int i= n; i < cmdHistory->Size(); i++) {
Command *c= (Command*) cmdHistory->At(i);
if (c) {
c->Finish();
cmdHistory->RemoveAt(i);
}
}
}
//---- CommandProcessor10 ------------------------------------------------------
NewMetaImpl(CommandProcessor10,CommandProcessor, (TVP(mem,cap), T(start), T(size)));
CommandProcessor10::CommandProcessor10(int s)
{
cap= s;
mem= new Command* [cap];
size= start= 0;
}
CommandProcessor10::~CommandProcessor10()
{
SafeDelete(mem);
}
Command *CommandProcessor10::GetAt(int i)
{
if (i >= start && i < start+size)
return mem[i % size];
return 0;
}
void CommandProcessor10::PerformNormalCommand(Command* cmd)
{
Command *lastcmd;
if (size >= cap) { // overflow
start++;
GetAt(changeCount)->Finish();
size--;
}
size++;
if (lastcmd= GetAt(changeCount-1))
lastcmd->Done(cmd);
mem[changeCount % size]= cmd;
changeCount+= cmd->Perform();
}
void CommandProcessor10::FinishFrom(int n)
{
Command *c;
n= (n == 0) ? start : changeCount;
for (int i= n; c= GetAt(i); i++)
c->Finish();
size-= (i-changeCount);
}